package javase.ch02.sync;

import java.util.concurrent.TimeUnit;

/**
 * @Desc TODO
 * @Author chenmin
 * @Date 2025/10/30
 *
 * 二、同步方法
 *    1.语法
 *    [访问权限修饰符] synchronized [static] void/返回值数据类型  方法名(形参列表){
 *        //同步代码
 *    }
 *
 *    2.同步方法
 *      2.1 成员方法
 *        - this作为对象锁，who来调用，who就是对象锁
 *        - 使用同一把锁(sync)，出现 "等待" 现象
 *        - 使用不是同一把锁(sync1 、 sync2)，出现 "争抢" 现象
 *
 *      2.2 静态方法
 *        - 类.class作为对象锁  对象是同一个类型，即同一把锁
 *        - 使用同一把锁(sync)，出现 "等待" 现象
 *        - 使用不是同一把锁(sync1 、 sync2)，出现 "等待" 现象
 */
public class SyncTest2 {

    public synchronized static void m1(){
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+" i = "+i);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public synchronized static void m2(){
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName()+" i = "+i);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) {
        SyncTest2 sync1 = new SyncTest2();
        SyncTest2 sync2 = new SyncTest2();

        //同一把对象锁  sync
        //不是同一把对象锁 sync1  sync2
        new Thread(()-> sync1.m1() , "线程1").start();
        new Thread(()-> sync2.m2() , "线程2").start();
    }

}
